package com.itheima.window;

public class LeetCode2134 {
    //交换 定义为选中一个数组中的两个 互不相同 的位置并交换二者的值。
    //
    //环形 数组是一个数组，可以认为 第一个 元素和 最后一个 元素 相邻 。
    //
    //给你一个 二进制环形 数组 nums ，返回在 任意位置 将数组中的所有 1 聚集在一起需要的最少交换次数。
    //思路：所有1被聚集在一起就相当于是将一个区域内的0全部移动出去，范围大小既是窗口大小既是1的数量，，因此只需寻找最少0区域,环形链表只需在尽头再往后推进（窗口长度-1）个
    //过程：先统计1的个数确认窗口，然后开始移动窗口

    public int minSwaps(int[] nums) {

        int window = 0;
        for (int i : nums) {
            window += i;
        }
        if(window == 0){
            return 0;
        }

        int length = nums.length;
        int sum = 0;
        int min = length;
        for (int i = 0; i < (length + window - 1); i++) {
            //窗口开始进入
            if(nums[i % length] == 0){
                sum++;
            }
            //未形成窗口直接下一轮循环
            if(i < window - 1){
                continue;
            }
            min = Math.min(min, sum);
            if(nums[i - window + 1] == 0){
                sum--;
            }
        }

        return min;
    }
}
